C语言程序设计之RLE压缩解压算法

先介绍一下RLE压缩算法:

游程编码(Run-Length Encoding, RLE)又称行程长度编码或者变动长度编码法,在控制理论中对于二值图像而言是一种编码方法,对连续的黑,白向像素以不同的码字进行编码。游程编码是一种简单的无损压缩方法,其特点是压缩和解压缩都非常快。该方法是用重复字节和重复次数来简单的描述重复的字节,也就是将一串连续的相同数据转换为特定的格式来达到压缩的目的。
RLE是一种简单的压缩算法,主要用于压缩图像中连续的重复的颜色块。当然RLE并不是只能应用于图像压缩上,RLE能压缩任何二进制数据。原始图像文件的数据有一个特点,那就是有大量连续重复的颜色数据,RLE正好是用来压缩有大量连续重复数据的压缩编码,但对于其他二进制文件而言,由于文件中相同的数据出现概率较少,使用RLE压缩这些数据重复性不强的文件效果不太理想,有时候压缩后的数据反而变大了。
RLE压缩方案是一种极其成熟的压缩方案,其特点是无损失压缩。

然后文件的一些基本操作我是看这篇博客了解的

感谢这位博主

最后就直接上代码了

(感觉仔细看了上面两个内容后就不用再过多解释了,代码里面有压缩函数的注释,解压和其相似就没有再写)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void zip(char *filename,char *outfile)
{//压缩函数 
	FILE *in, *out;//定义指向文件的指针 
	int filelen;//每一个字符连续重复出现的次数 
	char cur,tmp;	
	if(!(in=fopen(filename,"rb")))//以二进制方式打开只读文件(原文件必须存在) 
		printf("文件打开失败\n");//若文件不存在则进行提示 
	else
	{
		out=fopen(outfile,"wb");/*二进制方式打开只写文件
		(若文件不存在则会进行创建,若存在则会覆盖原内容)*/ 
		cur=fgetc(in);//读取第一个字符,返回读取到的字符
		tmp=cur;
		filelen=1;
		while(!feof(in))//读到文件末尾时结束循环 
		{
			cur=fgetc(in);
			if(cur==tmp){
				filelen++;
			}//进行RLE压缩 
			else{
				fputc(filelen+'0',out);//写一个字符(此处是计数数字),若失败则返回EOF 
				fputc(tmp,out);//同上,此处是原字符 
				tmp=cur;
				filelen=1;
			}
		}
	}
	fclose(in);
	fclose(out);//关闭文件 
}
void unzip(char *filename,char *outfile)
{//解压函数 ,注释会基本和上面一样 ,不再赘述 
	FILE *in, *out;
	int filelen;
	char cur;
	if(!(in=fopen(filename,"rb")))
		printf("文件打开失败\n");
	else
	{
		out = fopen(outfile,"wb");
		while(!feof(in)){
			filelen = fgetc(in)-'0';
			if(feof(in)) break;
			cur = fgetc(in);
			while(filelen--)
				fputc(cur,out);
		}
	}
	fclose(in);
	fclose(out);
}
int main(int argc,char *argv[])
{//通过判断命令行参数进行相应操作 
	if(!strcmp(argv[2], "-d"))
	{
		unzip(argv[1], argv[3]);
		printf("decompress finished\n");
	}
	else if(!strcmp(argv[2],"-c"))
	{
		zip(argv[1], argv[3]);
		printf("compress finished\n");
	}
	else
		printf("输入参数有误,请重新检查,-c : compress; -d : decompress\n"); 
	return 0;
}
  • 10
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
以下是使用C语言实现RLE压缩解压算法的代码示例。 RLE压缩算法: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // RLE压缩函数 char* rle_compress(const char* data) { int len = strlen(data); char* result = (char*)malloc(len * 2 + 1); int count = 1; char ch = data[0]; int j = 0; for (int i = 1; i < len; i++) { if (data[i] == ch) { count++; } else { result[j++] = count + '0'; result[j++] = ch; ch = data[i]; count = 1; } } result[j++] = count + '0'; result[j++] = ch; result[j] = '\0'; return result; } int main() { const char* data = "AAAABBBCCDDEEEE"; char* result = rle_compress(data); printf("压缩前:%s\n", data); printf("压缩后:%s\n", result); free(result); return 0; } ``` RLE解压算法: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // RLE解压函数 char* rle_decompress(const char* data) { int len = strlen(data); char* result = (char*)malloc(len + 1); int j = 0; for (int i = 0; i < len; i += 2) { int count = data[i] - '0'; char ch = data[i + 1]; for (int k = 0; k < count; k++) { result[j++] = ch; } } result[j] = '\0'; return result; } int main() { const char* data = "4A3B2C2D4E"; char* result = rle_decompress(data); printf("解压前:%s\n", data); printf("解压后:%s\n", result); free(result); return 0; } ``` 需要注意的是,在使用RLE压缩算法时,我们需要注意压缩后的字符串长度可能会变长,因此需要使用动态分配内存的方式来存储结果。在解压算法中,我们也需要使用动态分配内存的方式来存储解压后的字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值